package rsj.proxy;

import com.rlyy.aibase.db.QueryRunner;
import com.rlyy.aibase.utils.base.ListNode;
import com.rlyy.aibase.utils.base.MapNode;
import com.rlyy.aibase.utils.base.Node;
import com.rlyy.aibase.utils.base.TableNode;
import common.util.QueryRunnerFactory;

import java.util.HashMap;
import java.util.Map;

/**
 * @author yuanqinglong
 * @since 2021/5/14 9:35
 */
public class ExecuteStatementProcessorFactory {


    private static final QueryRunner QUERY_RUNNER = QueryRunnerFactory.getQueryRunner();

    /**
     * 根据返回值类型、找到对应返回值类型的查询方法
     */
    static final Map<Class<?>, PreExecuteStatementProcessor> RETURN_TYPE_MAP = new HashMap<>();

    static {
        // 初始化返回值类型和执行方法映射
        RETURN_TYPE_MAP.put(TableNode.class, QUERY_RUNNER::queryLinkTableNode);
        RETURN_TYPE_MAP.put(ListNode.class, QUERY_RUNNER::queryLinkColList);
        RETURN_TYPE_MAP.put(MapNode.class, QUERY_RUNNER::queryLinkRow);
        RETURN_TYPE_MAP.put(Node.class, QUERY_RUNNER::queryLinkNode);
        RETURN_TYPE_MAP.put(int.class, QUERY_RUNNER::update);
        RETURN_TYPE_MAP.put(void.class, QUERY_RUNNER::update);
        RETURN_TYPE_MAP.put(Integer.class, QUERY_RUNNER::update);
    }

    /**
     * 根据返回类型 获取执行SQL方法的函数式接口
     *
     * @param clazz 返回类型
     * @return 函数式接口
     */
    public static PreExecuteStatementProcessor getPreExecuteStatementProcessor(Class<?> clazz) {
        return RETURN_TYPE_MAP.get(clazz);
    }
}
